扫雷是电脑上很经典的游戏,虽然我没玩过。为了写这个博客,我特意去网上玩了一会。 几次调试之后,我觉得这个比三子棋要复杂一些,尤其是空白展开算法上和堵截玩家有的一拼。这个与实际游戏差别较大,不能使用光标。 接下来。我会很详细的讲解每一步分析。
扫雷
写代码前,扫雷需要什么进行主函数文件的代码game文件以及函数步骤
在主函数文件中使用game函数布值棋盘(雷盘和玩家棋盘)打印棋盘函数玩家排雷计算雷数的函数空白递归算法
写代码前,扫雷需要什么
1,游戏需要初始选择菜单 2,需要布置两个棋盘,一个布置雷,一个展示给玩家看 3,打印棋盘 4,玩家要输入选择的坐标,并且可以多次输入游戏坐标 5,每次输入后打印棋盘,同时判断是否继续还是输赢。 6,玩家每次输入坐标,都进行一次递归展开。
进行主函数文件的代码
void option(int input)
{
switch (input)//分支语句
{
case 1:
game();//扫雷开始
break;
case 0:
printf("Logon out the game\n");
break;
default:
printf("Input error,please input again\n");
break;
}
}
void menu(void)
{
printf("Welcome to game\n");
printf("\n");
printf("****************\n");
printf("*----1.play----*\n");
printf("*----0.exit----*\n");
printf("****************\n");
}
int main(void)
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();//打印游戏菜单
printf("please input option(1/0):>");
scanf("%d", &input);
option(input);//选项判断
} while (input);
}
game文件以及函数步骤
#include
#define ROW 9
#define COL 9
#define _CRT_SECURE_NO_WARNINGS
#define ROWS ROW+2
#define COLS COL+2
#define LEVEL 10
#include
#include
void game(void);//扫雷游戏
void setboard(char board[ROWS][COLS], int rows, int cols,char ret);//初始布置棋盘内容
void showboard(char board[ROWS][COLS], int rows, int cols);//负责打印棋盘
//void player(char board[ROWS][COLS]);//玩家输入
void setmine(char mine[ROWS][COLS], int row, int col);//布置地雷
int cleanmine(char board[ROWS][COLS], char mine[ROWS][COLS], int row, int col);
void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x,int y);//空白递归算法
int test(char mine[ROWS][COLS], int x, int y);//计算周围雷数
在主函数文件中使用game函数
void game()
{
char board[ROWS][COLS];
char mine[ROWS][COLS];
setboard(mine, ROWS, COLS,'0');//创建初始棋盘
setmine(mine, ROW, COL);//布雷要在一次游戏开始时就布好雷,只布一次雷
setboard(board, ROWS, COLS, '*');//给玩家看的棋盘
while (1)
{
int ret;
showboard(mine, ROW, COL);//打印布雷图
showboard(board, ROW, COL);//打印玩家棋盘
//player(board);
ret=cleanmine(board,mine,ROW,COL);//扫雷
//showboard(board, ROW, COL);
int count = 0;//可以用一个函数进行封装
for (int i = 1; i
if (board[i][j] == '*')
count++;
}
}
if (count == LEVEL)
{
printf("you win\n");
break;
}
if (ret == 0)
break;
system("cls");
}
}
布值棋盘(雷盘和玩家棋盘)
void setboard(char board[ROWS][COLS], int rows, int cols,char ret)
{
int i;//主要靠ret决定是布雷还是布置玩家棋盘
for (i = 0; i
board[i][j] = ret;
}
}
}
打印棋盘函数
每次将棋盘重新定义后就可以打印,但是我们设置的棋盘要比打印的大两行,为了保证之后计算雷数的循环成立。
void showboard(char board[ROWS][COLS], int rows, int cols)
{
for (int a = 0; a
printf("%c|", board[i][j]);
}
printf("\n");
}
}
玩家排雷
int cleanmine(char board[ROWS][COLS],char mine[ROWS][COLS],int row,int col)
{
int x, y;
while (1)
{
printf("please input the coordinate:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x = 1 && y
board[x][y] = test(mine, x, y) + '0';
//空白递归算法
space(board, mine, x, y);
//showboard(board, ROW, COL);
break;
}
else if (mine[x][y] == '1')
{
printf("You died\n");
return 0;
break;
}
}
else
printf("Coordinate is illegal,please input again\n");
}
printf("player\n");
//showboard(board, ROW, COL);
return 1;
}
计算雷数的函数
int test(char mine[ROWS][COLS], int x, int y)
{
int count = 0;
for (int i = x - 1; i
if (mine[i][j] == '1')
count++;
}
}
return count;//count就代表返回的雷数
}
空白递归算法
void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x, int y)
{
int i;
if(test(mine, x, y)==0)
{
board[x][y] = ' ';
for (i = x-1; i
if (i > 0 && i 0 && j |